﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Iacym.BusinessLogic;
using Iacym.Entities;
using Microsoft.Practices.Unity;

namespace Iacym.UI
{
    public partial class FrmMttoOfrenda : Form
    {
        [Dependency]
        public IOfrendaBL ofrendaBL { get; set; }

        [Dependency]
        public ITipoMonedaBL tipoMBL { get; set; }

        [Dependency]
        public ITipoOfrendaBL tipoOBL { get; set; }

        [Dependency]
        public ITipoPagoBL tipoPBL { get; set; }

        [Dependency]
        public ITipoReunionBL tipoRBL { get; set; }

        [Dependency]
        public IPersonaBL personaBL { get; set; }

        public USUARIO currentUsuarioMttoOfrenda { get; set; }

        public OFRENDA currentOfrenda
        {
            get { return oFRENDABindingSource.Current as OFRENDA; }
            set { oFRENDABindingSource.DataSource = value; }
        }

        bool isNew = true;
        int opc;
        int nromes = 0;
        List<OFRENDA> _listaOfrenda;
        string[] meses = { "Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre" };

        public FrmMttoOfrenda()
        {
            InitializeComponent();
            this.BuildUp();
            this.rbIndividual.Checked = true;
            _listaOfrenda = new List<OFRENDA>();
        }

        public void Nuevo()
        {
            isNew = true;

            LoadCombos();

            oFRENDABindingSource.AddNew();
        }

        private void btnBuscar_Click(object sender, EventArgs e)
        {
            FrmPersona frm = new FrmPersona();
            frm.Extend();
            frm.currentUsuarioPersona = currentUsuarioMttoOfrenda;
            frm.ShowDialog();
            if (frm.CurrentPersona != null)
            {
                currentOfrenda.PERSONA = frm.CurrentPersona;
                currentOfrenda.PersonaId = frm.CurrentPersona.Id;
                oFRENDABindingSource.ResetBindings(true);

            }
        }

        private void BtnGuardar_Click(object sender, EventArgs e)
        {
            var msg = "ERROR";

            if (opc == 1)
            {
                OFRENDA currentOfrenda = oFRENDABindingSource.Current as OFRENDA;

                if (currentOfrenda != null)
                {
                    try
                    {
                        currentOfrenda.Monto = Convert.ToDecimal(montoTextBox.Text);
                        currentOfrenda.Fecha = fechaDateTimePicker.Value;
                        currentOfrenda.Anulado = false;
                        ofrendaBL.AddOfrenda(currentOfrenda);
                        MessageBox.Show("Registro Correcto", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        Close();

                    }
                    catch (Exception ex)
                    {
                        msg = ex.Message;
                        MessageBox.Show(msg, "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                }
            }
            else if (opc == 2)
            {
                ObtenerDatosOfrendaMasiva();
                if (dataGridViewOfrenda.Rows.Count == _listaOfrenda.Count())
                {
                    try
                    {
                        foreach (var item in _listaOfrenda)
                            ofrendaBL.AddOfrenda(item);
                    }
                    catch (Exception ex)
                    {
                        msg = ex.Message;
                        MessageBox.Show(msg, "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                    MessageBox.Show("Registro Correcto", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    Close();
                }
                else
                {
                    MessageBox.Show("Falta uno o más datos para la ofrenda.", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
        }

        private void FrmMttoOfrenda_Load(object sender, EventArgs e)
        {
            if (rbIndividual.Checked)
            {
                opc = 1;
                gbOfrendaIndividual.Enabled = true;
                gbMasivo.Enabled = false;
                BtnNuevo.Enabled = false;
                gbOpciones.Enabled = false;
                gbCalcular.Enabled = false;
            }
            else if (rbMasivo.Checked)
            {
                opc = 2;
                gbMasivo.Enabled = true;
                gbOfrendaIndividual.Enabled = false;
                BtnNuevo.Enabled = true;
            }
        }

        private void LoadCombos()
        {
            if (isNew)
            {
                try
                {
                    tIPOMONEDABindingSource.DataSource = tipoMBL.GetAllFromTipoMoneda();
                    tIPOOFRENDABindingSource.DataSource = tipoOBL.GetAllFromTipoOfrenda();
                    tIPOPAGOBindingSource.DataSource = tipoPBL.GetAllFromTipoPago();
                    tIPOREUNIONBindingSource.DataSource = tipoRBL.GetAllFromTipoReunion();
                    cbMes.DataSource = meses;
                }
                catch (Exception)
                {

                    cbTipoMoneda.Text = "";
                    cbTipoOfrenda.Text = "";
                    cbTipoPago.Text = "";
                    cbTipoReunion.Text = "";
                }
            }
            else
            {
                tIPOMONEDABindingSource.DataSource = tipoMBL.GetAllFromTipoMoneda();
                tIPOOFRENDABindingSource.DataSource = tipoOBL.GetAllFromTipoOfrenda();
                tIPOPAGOBindingSource.DataSource = tipoPBL.GetAllFromTipoPago();
                tIPOREUNIONBindingSource.DataSource = tipoRBL.GetAllFromTipoReunion();
            }
        }

        private void rbIndividual_Click(object sender, EventArgs e)
        {
            if (rbIndividual.Checked)
            {
                opc = 1;
                gbOfrendaIndividual.Enabled = true;
                gbMasivo.Enabled = false;
                BtnNuevo.Enabled = false;
                gbOpciones.Enabled = false;
                gbCalcular.Enabled = false;
            }
            else
            {

            }
        }

        private void rbMasivo_Click(object sender, EventArgs e)
        {
            if (rbMasivo.Checked)
            {
                opc = 2;
                gbMasivo.Enabled = true;
                gbOfrendaIndividual.Enabled = false;
                BtnNuevo.Enabled = true;
                gbOpciones.Enabled = true;
                gbCalcular.Enabled = true;
            }
            else
            {
                opc = 1;
                gbOfrendaIndividual.Enabled = true;
                gbMasivo.Enabled = false;
                BtnNuevo.Enabled = false;
                gbOpciones.Enabled = false;
                gbCalcular.Enabled = false;
            }
        }

        private void BtnNuevo_Click(object sender, EventArgs e)
        {
            BuscarPersona();
        }

        private void BuscarPersona()
        {
            //var _ofrenda = oFRENDABindingSource.Current as OFRENDA;

            FrmPersona frm = new FrmPersona();
            frm.Extend();
            frm.currentUsuarioPersona = currentUsuarioMttoOfrenda;
            frm.ShowDialog();

            if (frm.CurrentPersona != null)
            {
                /*var existe = DuplicateValues(frm.CurrentPersona);
                if (!existe) dataGridViewOfrenda.Rows.Add(frm.CurrentPersona);
                else
                if (frm.CurrentPersona.Id == 1) MessageBox.Show("Esta persona no puede ser agregada a la lista.", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                else MessageBox.Show("Esta persona ya fue agregada a la lista.", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                 */
                dataGridViewOfrenda.Rows.Add(frm.CurrentPersona);
                oFRENDABindingSource.ResetBindings(true);
            }
        }

        private void oFRENDADataGridView_DataError(object sender, DataGridViewDataErrorEventArgs e)
        {
            MessageBox.Show("Error: " + e.Exception.Message);
        }

        private void rbIndividual_CheckedChanged(object sender, EventArgs e)
        {
            if (rbIndividual.Checked)
            {
                opc = 1;
                gbMasivo.Enabled = false;
                BtnNuevo.Enabled = false;
                dtpFecha.Enabled = false;
                gbOpciones.Enabled = false;
            }
        }

        private void rbMasivo_CheckedChanged(object sender, EventArgs e)
        {
            if (rbMasivo.Checked)
            {
                opc = 2;
                gbOfrendaIndividual.Enabled = false;
                BtnNuevo.Enabled = true;
                gbMasivo.Enabled = true;
                dtpFecha.Enabled = true;
                gbOpciones.Enabled = true;
            }
        }

        private void ObtenerDatosOfrendaMasiva()
        {
            int _tofrenda;
            _tofrenda = Convert.ToInt32(cbTipoDonacion.SelectedValue.ToString());

            int _treunion;
            _treunion = Convert.ToInt32(cbTipoCulto.SelectedValue.ToString());
            
            foreach (DataGridViewRow row in dataGridViewOfrenda.Rows)
            {
                int _tmoneda;
                if (row.Cells[1].Value == null || row.Cells[1].Value.ToString() == string.Empty) break;
                else _tmoneda = Convert.ToInt32(row.Cells["TIPO_MONEDA"].Value.ToString());

                int _tpago;
                if (row.Cells[2].Value == null || row.Cells[2].Value.ToString() == string.Empty) break;
                else _tpago = Convert.ToInt32(row.Cells["TIPO_PAGO"].Value.ToString());

                //int _tofrenda;
                //if (row.Cells[3].Value == null || row.Cells[3].Value.ToString() == string.Empty) break;
                //else _tofrenda = Convert.ToInt32(row.Cells["TIPO_OFRENDA"].Value.ToString());

                //int _treunion;
                //if (row.Cells[4].Value == null || row.Cells[4].Value.ToString() == string.Empty) break;
                //else _treunion = Convert.ToInt32(row.Cells["TIPO_REUNION"].Value.ToString());

                Decimal _monto;
                if (row.Cells[5].Value == null || row.Cells[5].Value.ToString() == string.Empty) break;
                else _monto = Convert.ToDecimal(row.Cells["MONTO"].Value.ToString());

                var _persona = row.Cells["PERSONA"].Value as PERSONA;

                int _mes = 0;
                if (row.Cells[6].Value == null || row.Cells[6].Value.ToString() == string.Empty) break;
                else _mes = DevolverMes(row.Cells["cbMes"].Value.ToString());

                string _anio;
                if (row.Cells[7].Value == null || row.Cells[7].Value.ToString() == string.Empty) break;
                else _anio = row.Cells["anioOfrenda"].Value.ToString();

                var fecha = "01-" + _mes.ToString() + "-" + _anio;

                var ofrenda = new OFRENDA()
                {
                    Anulado = false,
                    Fecha = dtpFecha.Value.Date,
                    FechaDonacion = DateTime.Parse(fecha).Date,
                    Monto = _monto,
                    TipoMonedaId = _tmoneda,
                    TipoPagoId = _tpago,
                    TipoOfrendaId = _tofrenda,
                    TipoReunionId = _treunion,
                    TIPO_MONEDA = tipoMBL.GetFromTipoMonedaById(_tmoneda),
                    TIPO_OFRENDA = tipoOBL.GetFromTipoOfrendaById(_tofrenda),
                    TIPO_PAGO = tipoPBL.GetFromTipoPagoById(_tpago),
                    TIPO_REUNION = tipoRBL.GetFromTipoReunionById(_treunion),
                    PERSONA = _persona,
                    PersonaId = _persona.Id
                };
                _listaOfrenda.Add(ofrenda);
            }
        }

        private int DevolverMes(string _mes)
        {
            switch (_mes)
            {
                case "Enero":
                    nromes = 1;
                    break;
                case "Febrero":
                    nromes = 2;
                    break;
                case "Marzo":
                    nromes = 3;
                    break;
                case "Abril":
                    nromes = 4;
                    break;
                case "Mayo":
                    nromes = 5;
                    break;
                case "Junio":
                    nromes = 6;
                    break;
                case "Julio":
                    nromes = 7;
                    break;
                case "Agosto":
                    nromes = 8;
                    break;
                case "Septiembre":
                    nromes = 9;
                    break;
                case "Octubre":
                    nromes = 10;
                    break;
                case "Noviembre":
                    nromes = 11;
                    break;
                case "Diciembre":
                    nromes = 12;
                    break;
                default:
                    break;
            }

            return nromes;
        }
        
        private Boolean EsFecha(String fecha)
        {
            try
            {
                DateTime.Parse(fecha);
                return true;
            }
            catch
            {
                return false;
            }
        }

        private bool DuplicateValues(PERSONA persona)
        {
            foreach (DataGridViewRow row in dataGridViewOfrenda.Rows)
                if ((row.Cells[0].Value as PERSONA).Id.Equals(persona.Id))
                    return true;
            return false;

        }

        private void dataGridViewOfrenda_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            if (this.dataGridViewOfrenda.Columns[e.ColumnIndex].Name.Equals("btnQuitarOfrenda"))
            {
                var rpt = MessageBox.Show("¿Seguro que desea quitarlo de la grilla?", "Mensaje", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

                if (rpt == DialogResult.Yes)
                {
                    dataGridViewOfrenda.Rows.Remove(dataGridViewOfrenda.Rows[e.RowIndex]);
                }
            }
        }

        private void dataGridViewOfrenda_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
        {
            //Validamos si no es una fila nueva
            if (!dataGridViewOfrenda.Rows[e.RowIndex].IsNewRow)
            {
                if (e.ColumnIndex == 6)
                {
                    nromes = DevolverMes(e.FormattedValue.ToString());
                }
                //Sólo controlamos el dato de la columna 6
                if (e.ColumnIndex == 7)
                {
                    if (e.FormattedValue.ToString().Length > 0 && e.FormattedValue.ToString().Length < 5)
                    {
                        var fecha = "01-" + nromes.ToString() + "-" + e.FormattedValue.ToString();

                        //if (!this.EsFecha(e.FormattedValue.ToString()))
                        if (!this.EsFecha(fecha))
                        {
                            MessageBox.Show("El dato introducido no es de tipo fecha", "Error de validación",
                                            MessageBoxButtons.OK, MessageBoxIcon.Error);
                            dataGridViewOfrenda.Rows[e.RowIndex].ErrorText = "El dato introducido no es de tipo fecha";
                            e.Cancel = true;
                        }
                    }
                    else
                    {
                        MessageBox.Show("Formato de año: '14' o '2014'", "Error de validación",
                                            MessageBoxButtons.OK, MessageBoxIcon.Error);
                        dataGridViewOfrenda.Rows[e.RowIndex].ErrorText = "El dato introducido no es de tipo fecha";
                        e.Cancel = true;
                    }
                    
                }
            }
        }

        private void dataGridViewOfrenda_CellEndEdit(object sender, DataGridViewCellEventArgs e)
        {
            //Elimina el mensaje de error de la cabecera de la fila
            dataGridViewOfrenda.Rows[e.RowIndex].ErrorText = String.Empty;
        }

        private void btnCalcular_Click(object sender, EventArgs e)
        {
            Decimal montoSoles = 0;
            Decimal montoDolares = 0;
            Decimal montoEuros = 0;

            foreach (DataGridViewRow row in dataGridViewOfrenda.Rows)
            {
                if (row.Cells[1].Value.ToString().CompareTo("1") == 0)
                    montoSoles += Convert.ToDecimal(row.Cells[5].Value.ToString());
                else if (row.Cells[1].Value.ToString().CompareTo("2") == 0)
                    montoDolares += Convert.ToDecimal(row.Cells[5].Value.ToString());
                else if (row.Cells[1].Value.ToString().CompareTo("3") == 0)
                    montoEuros += Convert.ToDecimal(row.Cells[5].Value.ToString());
            }

            txtSoles.Text = montoSoles.ToString();
            txtDolares.Text = montoDolares.ToString();
            txtEuros.Text = montoEuros.ToString();
        }
    }
}
